package com.twq.oo.abstractscls.first


/**
 * Created by tangweiqun on 2017/11/28.
 * 1、使用abstract来定义一个抽象类
 */
abstract class Element {
  //2、定义一个抽象方法(没有实现)
  def contents: Array[String]

  //3、定义没有括号的具体方法
  //3.1、可以使用val代替def，val的话调用的性能比较好，因为类初始化的时候就已经计算好了，但是val占内存，而def不占内存
  //3.2、在scala中，如果是没有参数的方法，通常都是将()去掉，但是含有side effect的方法除外，比如println()，最好带上()
  def height: Int = contents.length

  def width: Int = if (height == 0) 0 else contents(0).length
}

//4、ArrayElement继承Element，那么Element是ArrayElement的父类，而ArrayElement是Element的子类
//ArrayElement会继承Element中非私有成员
class ArrayElementOld(conts: Array[String]) extends Element {
  override def contents: Array[String] = conts

  //5、在scala中，如果方法没有参数的话，则子类可以用val来实现
  //val contents: Array[String] = conts

  //在scala中，相同的类里不能定义名字相同的方法和变量，这个在java中是可以的
  /*def f() = {

  }

  val f = 3*/
}


//6、将值参数和域合并为参数化域(parametric fields)，使得代码更加简洁
class ArrayElement(
                    val contents: Array[String]
                  ) extends Element


object Spiral {
  def main(args: Array[String]): Unit = {
    //编译不过
    //new Element

    val ele = new ArrayElement(Array("sss"))
    println(ele.width)
    println(ele.height)
  }
}